package tw.right929.proxy
{
	import flash.utils.Proxy;
	import flash.utils.flash_proxy;
	
	use namespace flash_proxy
	
	/**
	 * 方便使用聚合的物件。
	 * 在建構式中傳入要聚合的物件，
	 * 參數越後面的，優先序越高。
	 */
	public dynamic class Aggregation extends Proxy
	{
		private var _collection:Array	=	new Array();
		
		public function Aggregation(...objects)
		{
			super();
			_collection.push.apply(_collection , objects);
		}
		
		/**
		 * 尋找聚合物件之中是否有這個屬性。
		 */
		override flash_proxy function hasProperty(name:*):Boolean
		{
			for(var i:int = _collection.length-1 ; i>=0 ; i--)
			{
				if(_collection[i].hasOwnProperty(name))
					return true;
			}
			return false;
		}
		
		/**
		 * 不能增加新的屬性，只能設定已存在聚合物件中的屬性。
		 */
		override flash_proxy function setProperty(name:*, value:*):void
		{
			for(var i:int = _collection.length-1 ; i>=0 ; i--)
			{
				if(_collection[i].hasOwnProperty(name))
				{
					if(_collection[i][name] == value)
						return;
					_collection[i][name]	=	value;
					return;
				}
			}
		}
		
		/**
		 * 傳回已存在聚合物件之中的屬性。
		 */
		override flash_proxy function getProperty(name:*):*
		{
			for(var i:int = _collection.length-1 ; i>=0 ; i--)
			{
				if(_collection[i].hasOwnProperty(name))
					return _collection[i][name];
			}
			return undefined;
		}
		
		/**
		 * 呼叫聚合物件之中的方法。
		 */
		override flash_proxy function callProperty(name:*, ... rest):*
		{
			for(var i:int = _collection.length-1 ; i>=0 ; i--)
			{
				if(_collection[i].hasOwnProperty(name))
					return _collection[i][name].apply(this , rest);
			}
			return undefined;
		}
	}
}
